from .frame import *

class PublicFunctionClass():
    
    
    
    
    @staticmethod
    def execute_function_ntimes(_number_of_times: int, _function_to_execute, *args, **kwargs) -> None:
        """执行指定函数多次

        此函数接收一个整数和一个可接受参数的函数, 按照整数指定的次数执行该函数

        Args:
            _number_of_times (int): 函数需要被执行的次数
            _function_to_execute (function): 需要被调用的函数
            *args: 传递给函数的位置参数
            **kwargs: 传递给函数的关键字参数

        Returns:
            None: 无返回值

        Example:
            def greet(name):
                print(f"Hello {name}")

            ExecuteFunctionNTimes(3, greet, "Alice")
            # 输出:
            # Hello Alice
            # Hello Alice
            # Hello Alice
        """
        for i in range(_number_of_times):
            _function_to_execute(*args, **kwargs)










class CustomWebDriver(WebDriver):
    _instance = None




    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(CustomWebDriver, cls).__new__(cls)
        return cls._instance
    

    
    
    def __init__(self,):
        self.options = Options()
        self.service = Service()
        self.options.add_experimental_option("debuggerAddress", "127.0.0.1:9652")
        super().__init__(options=self.options)




    def custom_findlement(self, xpathvalue: str):
        """
        通过 XPath 查找单个元素，并将结果存储在实例变量 _element 中。

        Args:
            xpathvalue (str): 要查找的元素的 XPath 路径。

        Returns:
            None
        """
        # 使用 find_element 方法通过 XPath 查找元素
        self._element = self.find_element(by="xpath", value=xpathvalue)



      
    def custom_element_click(self):
        self._element.click()




    def custom_sendkeys(self,keys):
        self._element.send_keys(keys)




    def checkout_current_handle_is_activate(self):
        current_title = self.title
        current_url = self.current_url
        
        if "DevTools" in current_title:
            return  False
        if "devtools" in current_url:
            return False
        
        return True





    def checkout_and_switch_to_normal_pack(self):
        """
        遍历所有窗口句柄，检查并切换到正常的包窗口。

        此方法的目的是在多窗口环境中，找到并激活一个特定的窗口（称为“正常的包”）。
        它首先遍历所有窗口句柄，对于每个窗口，检查当前窗口是否为激活状态。
        如果找到了激活的窗口，则立即返回True，表示找到了目标窗口。
        如果没有找到激活的窗口，则会切换到下一个窗口，直到遍历完所有窗口。

        Returns:
            bool: 如果找到并激活了目标窗口，返回True；否则，返回隐式的None。
        """
        for handle in self.window_handles:
            # 检查当前窗口句柄是否为激活状态
            if self.checkout_current_handle_is_activate():
                return True
            else:
                # 当前窗口不是激活状态，切换到下一个窗口
                self.switch_to.window(handle)





    @staticmethod
    def checkout_has_msedge_process(_process_name:str="msedge.exe"):
        """检查是否存在指定名称的进程
            
            Args:
                _process_name (str): 进程名称
            
            Returns:
                bool: 如果存在指定名称的进程，则返回 True，否则返回 False
            
            Example:
                >>> CheckMsEdgeProcess('msedge.exe')
                True
            """
        _is_process_running = False
        for _proc in psutil.process_iter(['name']):
            if _proc.info['name'] == _process_name:
                _is_process_running = True
                break
        return _is_process_running





    @staticmethod
    def checkout_debug_mode_activate() -> bool:
        """
        检查调试模式路径是否可用

        Returns:
            bool: 如果调试模式路径可用，则返回 True，否则返回 False

        Example:
            >>> MyEdge.CheckOutDebugModePath()
            True
        """
        url = "http://127.0.0.1:9652/json/version"
        try:
            response = requests.get(url=url)
            if response.status_code == 200:
                result = True
            else:
                result = False
        except Exception as e:
            print(f"请求调试模式路径时发生错误: {e}")
            result = False
        return result





    @staticmethod
    def close_all_msedge_process(_process_name: str="msedge.exe") -> bool:
        """
        关闭所有指定名称的进程

        Args:
            _process_name (str): 进程名称

        Returns:
            bool: 如果成功关闭所有指定名称的进程，则返回 True，否则返回 False

        Example:
            >>> MyEdge.CloseAllMsEdgeProcess('msedge.exe')
            True
        """
        success = True  # 初始化返回值
        for proc in psutil.process_iter(['pid', 'name']):
            if _process_name == proc.info['name']:
                try:
                    proc.kill()  # 关闭进程
                    print(f"Closed Microsoft Edge process with PID: {proc.info['pid']}")
                except Exception as e:
                    print(f"Failed to close Microsoft Edge process with PID: {proc.info['pid']}. Error: {e}")
                    success = False  # 如果关闭失败，设置返回值为 False
        return success




    @staticmethod
    def start_debugmode_browser():
        # 定义启动命令
        command = r'"C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" --remote-debugging-port=9652 --disable-extensions "http://127.0.0.1:9652/json/version" "https://fxg.jinritemai.com/ffa/mshop/homepage/index" "https://myseller.taobao.com/home.htm/QnworkbenchHome/"'
        
        # 启动新的进程
        subprocess.Popen(command, shell=True)
    









